#ifndef DW_GRAFFITI_MATRIX_STACK_H
#	define DW_GRAFFITI_MATRIX_STACK_H

#include <stack>

namespace dw {
	namespace graffiti {

		namespace matrix {
			
enum matrices
{
	model = 0,
	view,
	proj,

	modelview,
	modelviewproj,

	matrices_count
};

		} // namespace matrix

struct MatrixStack
{
public : //! @name Construction & Destruction
	//! @{
	explicit MatrixStack(dw::uint32 capacity);
	~MatrixStack();
	//! @}

public : //! @name Commands
	//! @{
	void push();
	void push(const glm::mat4& mat);
	void pop();
	void set(const glm::mat4& mat);
	void mult(const glm::mat4& mat);
	//! @}

public : //! @name State
	//! @{
	const glm::mat4& top() const ;
	//! @}

private : //! @name Types definitions
	//! @{
	typedef std::stack< glm::mat4 > MatStack;
	//! @}

private : //! @name Data
	//! @{
	MatStack m_stack;
	dw::uint32 m_capacity;
	//! @}
};

	} // namespace graffiti
} // namespace dw

#include "matrixstack.inl"

#endif // !DW_GRAFFITI_MATRIX_STACK_H
